package com.aol.micro.server.async.data.writer; import java.util.Random; import java.util.concurrent.Executor; import java.util.function.Supplier; import cyclops.async.Future; import cyclops.collections.MapX; import org.jooq.lambda.tuple.Tuple; import com.aol.micro.server.events.SystemData; import com.aol.micro.server.manifest.ManifestComparator; import com.aol.micro.server.utility.HashMapBuilder; import com.google.common.eventbus.EventBus; import lombok.AllArgsConstructor; @AllArgsConstructor public class AsyncDataWriter<T> implements DataWriter<T> { public static final String MANIFEST_COMPARATOR_DATA_LOADER_KEY = "Manifest Comparator AsyncDataWriter Load Operation"; public static final String MANIFEST_COMPARATOR_DATA_WRITER_KEY = "Manifest Comparator AsyncDataWriter Save and increment Operation"; private final Executor executorService; private final ManifestComparator<T> comparator; private final Random r = new Random(); private final EventBus bus; public static <T> AsyncDataWriter<T> asyncDataWriter(Executor executorService, ManifestComparator<T> comparator) { return asyncDataWriter(executorService, comparator, new EventBus()); } public static <T> AsyncDataWriter<T> asyncDataWriter(Executor executorService, ManifestComparator<T> comparator, EventBus bus) { return new AsyncDataWriter<>( executorService, comparator, bus); } @Override public Future<T> loadAndGet() { String correlationId = "" + System.currentTimeMillis() + ":" + r.nextLong(); Supplier<MapX<String, String>> dataMap = () -> MapX.fromMap(HashMapBuilder.map(MANIFEST_COMPARATOR_DATA_LOADER_KEY, comparator.toString()) .build()); return Future.ofSupplier(() -> Tuple.tuple(comparator.load(), comparator.getData()), executorService) .peek(t -> bus.post(SystemData.<String, String> builder() .correlationId(correlationId) .dataMap(dataMap.get()) .errors(0) .processed(t.v1 ? 1 : 0) .build())) // add // recover // option // here // also // with // cyclops-react // 1.0.0-final .map(t -> t.v2); } @Override public Future<Void> saveAndIncrement(T data) { String correlationId = "" + System.currentTimeMillis() + ":" + r.nextLong(); Supplier<MapX<String, String>> dataMap = () -> MapX.fromMap(HashMapBuilder.map(MANIFEST_COMPARATOR_DATA_WRITER_KEY, comparator.toString()) .build()); return Future.<Void> ofSupplier(() -> { comparator.saveAndIncrement(data); return null; } , executorService) .peek(t -> bus.post(SystemData.<String, String> builder() .correlationId(correlationId) .dataMap(dataMap.get()) .errors(0) .processed(1) .build())); // add // recover // option // here // also // with // cyclops-react // 1.0.0-final } @Override public Future<Boolean> isOutOfDate() { return Future.ofSupplier(() -> comparator.isOutOfDate(), executorService); } }